package n70_共享模型值不可变;

import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;

/**
 * @author fu
 * @date 2022-02-20 14:32
 * 概要：
 * ---------------------------------------------------------------
 * |                                                              |
 * |        SimpleDateFormat 不是线程安全的                        |
 * |        DateTimeFormatter 不可变对象 可以 保证在多线程下的安全    |
 * |                                                             |
 * |=============================================================
 */
@Slf4j(topic = "c.T1")
public class T1_日期转换的问题 {

    public static void main(String[] args) {


        test2();
    }

    // SimpleDateFormat 不是线程安全的  【运行会报错！】
    private static void test0() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    log.debug("{}", sdf.parse("1951-04-21"));
                } catch (Exception e) {
                    log.error("{}", e);
                }
            }).start();
        }
    }

    // 用 锁 ，互斥可以解决，但是 性能低
    private static void test1(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for (int i = 0; i < 10; i++) {

            new Thread(() -> {
                synchronized (sdf) {
                    try {
                        log.debug("{}", sdf.parse("1951-04-21"));
                    } catch (Exception e) {
                        log.error("{}", e);
                    }
                }
            }).start();
        }
    }

    // DateTimeFormatter 是线程安全的 【是 不可变对象 可以 保证在多线程下的安全】
    private static void test2(){
        DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        for (int i = 0; i < 10; i++) {

            new Thread(() -> {
                synchronized (sdf) {
                    try {
                        log.debug("{}", sdf.parse("1951-04-21"));
                    } catch (Exception e) {
                        log.error("{}", e);
                    }
                }
            }).start();
        }
    }

}
